package ru.chezclif.lern.conread;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import ru.chezclif.lern.conread.parser.PathDataInputProperties;
/**
 * Наполнение хранилища данных из файла .ini
 * @author Vit
 */
public class IniParser implements PathDataInputProperties{
	private DataBuffer localPropertyBuffer;
		private String standartLine = "";
		private String multiLine = "";
			private boolean multilineDontRead = false;
				private boolean furstLine=true;
				private boolean endline = false;
				private String endLineString="";
	@Override
	/**По параметру filePath находится файл, из него получают настройки и сохраняют в объект propertyBuffer
	 *@param filePath полный путь к оперируемому файлу
	 *@param propertyBuffer хранилище данных для заполнения*/
	public void parseFile(String filePath, DataBuffer propertyBuffer) {
				Preconditions.notBlank(filePath);
				Preconditions.notNull(filePath);
				Preconditions.notNull(propertyBuffer);
		this.localPropertyBuffer = propertyBuffer;
		try {
			FileReader filereader;
			BufferedReader simpleBuffer;
				filereader = new FileReader(filePath);
				simpleBuffer = new BufferedReader(filereader);
			if (!(simpleBuffer.ready())) {
				throw new ru.chezclif.lern.conread.exceptions.EmptyFileExeption(filePath);
			}
			// Построчное чтение содержимого файла
			while ((standartLine = simpleBuffer.readLine()) != null) {
				if (!multilineDontRead) {
					multiLine = standartLine;
				}
				if (multilineDontRead) {
					multiLine = multiLine + standartLine;
					multilineDontRead = false;
				}
				multiLine = multiLine.trim();
				// Обработка текста подряд разными парсерами
				slashParsing();
				commentParsing();
				bracketParsing();
				// запись настроек в базу
				if (!(multiLine == "")) {
					equallParsing();
				}
					if (furstLine){
						furstLine=!furstLine;
					}
						endLineString=standartLine;
			}
							endline=true;
							EndCommentParsing();
			simpleBuffer.close();
			filereader.close();
		} catch (FileNotFoundException e) {
			throw new ru.chezclif.lern.conread.exceptions.FileNotFoundException(e, filePath);
		} catch (IOException e) {
			throw new ru.chezclif.lern.conread.exceptions.FileNotFoundException(e, filePath);
		}
	}
	/**Удаление из строк слешей и сборка до целой строки */
	private void slashParsing() {
		for (short i = 0; i < multiLine.length(); ++i) {
			if (multiLine.charAt(i) == '\\') {
				if ((i == multiLine.length() - 1)) {
					// Убрать слеш
					multiLine = multiLine.substring(0, multiLine.length() - 1);
					multilineDontRead = true;
				}
			}
		}
	}
	/**Удаление из строк комментариев */
	private void commentParsing() {
		if (!multilineDontRead) {
			for (short i = 0; i < multiLine.length(); ++i) {
				if (multiLine.charAt(i) == ';') {
					if (i == 0) {
						furstCommentParsing();
						multiLine = "";
					}
					if (i > 0) {
						multiLine = multiLine.substring(0, i - 1);
						break;
					}
				}
			}
		}
	}
	/**Нахождение головного комментария */
	private void furstCommentParsing(){
		if ((furstLine==true)) {
			localPropertyBuffer.setHeaderComment(multiLine.substring(1));
		}
	}
	/**Нахождение нахождение конечного комментария */
	private void EndCommentParsing(){
		if ((endline==true)&&(endLineString.charAt(0) == ';')) {
			localPropertyBuffer.setFooterComment(endLineString.substring(1));
		}
	}
	/**Нахождение знака равенства и сохранение найденных настроек */
	private void equallParsing() {
		if (!multilineDontRead) {
			for (short i = 0; i < multiLine.length(); ++i) {
				if (multiLine.charAt(i) == '=') {
					this.localPropertyBuffer.setSetting(multiLine.substring(0, i).trim(),
							multiLine.substring(i + 1, multiLine.length())
							.trim());
				}
			}
		}
	}
	/**Удаление из строк скобок и их содержимого */
	private void bracketParsing() {
		if (!multilineDontRead) {
			short leftBracketPozition=-1;
			short rightBracketPozition=-1;
			for (short i = 0; i < multiLine.length(); ++i) {
				if (multiLine.charAt(i) == '[') {
					leftBracketPozition=i;
				}
				if (multiLine.charAt(i) == ']') {
					rightBracketPozition=i;
				}
			}
					if ((leftBracketPozition<rightBracketPozition)&&(!(leftBracketPozition==-1))){
				multiLine=multiLine.substring(0, leftBracketPozition)+multiLine.subSequence(rightBracketPozition+1, multiLine.length());
					}
		}
	}
}
